#include <iostream>
#include <vector>
#include <ctime>
#include <algorithm>

using namespace std;

// 遍历容器中的数据
template <typename Container>
void showContainer(const Container& con)
{
    typename Container::const_iterator it = con.begin();
    for(; it != con.end(); it ++)
        cout << *it << " ";
    cout << endl;
}

template <typename Compare, typename T>
class _my_bind1st
{
public:
    // 这里使用常量左值引用来接受传入的左值变量comp，不可以对其进行修改
    // _my_bind1st(const Compare& comp, const T& val):_comp(comp),_val(val) {}
    _my_bind1st(const Compare& comp, const T& val):_comp(comp),_val(val) {}
    /*
        小括号运算符重载函数需要加const，我们这里的this->_comp是对comp的引用，是个常量左值引用，不可以修改
        如果不加const会导致编译不通过
    */ 
    bool operator()(const T& data) const
    {
        return this->_comp(this->_val, data);
    }
private:
    Compare _comp;
    T _val;
};

template <typename Compare, typename T>
_my_bind1st<Compare, T> my_bind1st(Compare&& comp, const T& val)
{
    // Compare&& comp comp是一个右值引用，但他实际上还是个左值变量
    return _my_bind1st<Compare, T>(comp, val);
}

template <typename Iterator, typename Compare>
Iterator my_find_if(Iterator&& first, Iterator&& last, const Compare& comp)
{
    for(; first != last; first ++)
    {
        if(comp(*first))
            return first;
    }
    return last;
}

int main(int argc, char const *argv[])
{
    // 定义一个vector容器用于存储数字
    vector<int> vec;

    // 种下一个随机数的种子
    srand(time(nullptr));

    // 随机插入十个数字
    for(int i = 0; i < 10; i ++)
        vec.push_back(rand() % 100);
    showContainer(vec);

    // 将随机数列从大到小排列
    sort(vec.begin(), vec.end(), greater<int>());
    showContainer(vec);

    // 自定义一个泛型算法my_find_if 和 绑定器my_bind1st
    auto it1 = my_find_if(vec.begin(), vec.end(), my_bind1st(greater<int>(), 50));
    if(it1 != vec.end())
    {
        vec.insert(it1, 50);
    }
    showContainer(vec);
    return 0;
}
